"""
迭代器：
    1、什么是可迭代对象？
    生活中比喻：想象你有一个装了很多玩具的箱子（比如一箱乐高积木块），你可以一个个拿出来玩。这个箱子就是「可迭代对象」。
    Python中例子：列表、字符串、字典、元组等。
    2、怎么判断是不是可迭代对象？
    用 for 循环能遍历的就是可迭代对象：
    3、迭代器是什么？
    生活中比喻：迭代器就像「一个帮你从箱子里拿玩具的机器人」，它记得你拿过哪个，下次会继续拿下一个。
    Python中的定义：迭代器是一个可以记住遍历位置的对象，能逐个返回元素。
    4、迭代器和可迭代对象的关系？
    所有迭代器都是可迭代对象（可以用 for 循环遍历）。
    但可迭代对象不一定是迭代器（比如列表本身不是迭代器，但可以变成迭代器）。
    5、如何创建迭代器？
    方法1：用 iter() 函数把可迭代对象变成迭代器
    用 next() 逐个获取元素
    重点理解：
    迭代器是「一次性」的，遍历完就空了（就像倒空的咖啡杯）。
    for 循环内部其实自动调用了 iter() 和 next()，并处理了 StopIteration 错误。
    6、为什么需要迭代器？
    优势1：节省内存
    列表的问题：如果有一个包含100万个元素的列表，全部存在内存里很占空间。
    迭代器的解决：迭代器一次只生成一个元素（比如从文件逐行读取），内存占用极低。
    优势2：处理无限序列
    比如生成无限的自然数序列，迭代器可以做到，而列表无法存储无限个元素。
"""

"""
创建迭代器:
    方法1：用 iter() 函数把可迭代对象变成迭代器
"""
# 方法1：
my_list = [1, 2, 3]
my_iterator = iter(my_list)  # 把列表变成迭代器
print(next(my_iterator))  # 用 next() 逐个获取元素，如果没有元素了会保错，并且只能遍历一次
print(next(my_iterator))
print(next(my_iterator))
print(list(my_iterator))

# 用迭代器遍历字符串
str1 = "abc"
str1_iterator = iter(str1)
print(next(str1_iterator))
print(next(str1_iterator))
print(next(str1_iterator))
print(list(str1_iterator))

"""
列表和迭代器的区别：
    列表：可以随时访问，依然存在
    迭代器：只能遍历一次
"""
list1 = [1, 2, 3]  # 列表
list1_iterator = iter(list1)  # 迭代器
print(list(list1_iterator))  # [1, 2, 3]
print(list(list1_iterator))  # [] -> 空了
print(list1)  # [1, 2, 3]
print(list1)  # [1, 2, 3]
